package com.training.config;

import com.jfinal.config.*;
import com.jfinal.ext.interceptor.SessionInViewInterceptor;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.template.Engine;
import com.training.common.PowerRoleTool;
import com.training.common.model._MappingKit;
import com.training.controller.*;
import com.training.interceptor.LoginInterceptor;

public class TrainingConfig extends JFinalConfig {

    static Prop p;

    /**
     * 先加载开发环境配置，然后尝试加载生产环境配置，生产环境配置不存在时不会抛异常
     * 在生产环境部署时后动创建 demo-config-pro.txt，添加的配置项可以覆盖掉
     * config-dev.txt 中的配置项
     */
    static void loadConfig() {
        if (p == null) {
            p = PropKit.use("config-dev.txt").appendIfExists("demo-config-pro.txt");
        }
    }

    /**
     * 配置常量
     */
    @Override
    public void configConstant(Constants constants) {
        loadConfig();
        constants.setDevMode(p.getBoolean("devMode", false));

        // 支持 Controller、Interceptor 之中使用 @Inject 注入业务层，并且自动实现 AOP
        constants.setInjectDependency(true);
        constants.setError404View("/404.html");
        constants.setError500View("/500.html");
        constants.setErrorView(204,"/204.html");
        constants.setErrorView(501,"/501.html");
        constants.setErrorView(503,"/503.html");
    }

    /**
     * 配置路由
     */
    @Override
    public void configRoute(Routes routes) {
        routes.add("/", WebController.class);
        routes.add("/login", LoginController.class);
        routes.add("/menu", MenuController.class);
        routes.add("/role", RoleController.class);
        routes.add("/user", UserController.class);
        routes.add("/class",ClassController.class);
        routes.add("/student",StudentController.class);
        routes.add("/subject",SubjectController.class);
        routes.add("/train",TrainController.class);
        routes.add("/analyst",AnalystController.class);
    }

    @Override
    public void configEngine(Engine engine) {
        engine.setDevMode(true);
        //engine.setBaseTemplatePath(null);
        //engine.setToClassPathSourceFactory();
        engine.addSharedFunction("/common/_layout.html");
        engine.addSharedObject("roletool",new PowerRoleTool());
        //engine.addSharedFunction("/common/_paginate.html");
    }

    /**
     * 配置插件
     */
    @Override
    public void configPlugin(Plugins plugins) {
        // 配置 druid 数据库连接池插件
        DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
        plugins.add(druidPlugin);

        // 配置ActiveRecord插件
        ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
        Engine engine = arp.getEngine();
        arp.setShowSql(true);
        // 上面的代码获取到了用于 sql 管理功能的 Engine 对象，接着就可以开始配置了
        engine.setToClassPathSourceFactory();
        engine.addSharedMethod(new StrKit());
        // 所有映射在 MappingKit 中自动化搞定
        arp.addSqlTemplate("all.sql");
        _MappingKit.mapping(arp);
        plugins.add(arp);
    }

    public static DruidPlugin createDruidPlugin() {
        loadConfig();

        return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
    }

    /**
     * 配置全局拦截器
     */
    @Override
    public void configInterceptor(Interceptors interceptors) {
        interceptors.add(new LoginInterceptor());
        interceptors.add(new SessionInViewInterceptor());
    }

    /**
     * 配置处理器
     */
    @Override
    public void configHandler(Handlers handlers) {
        handlers.add(new BasePathHandler("base"));
    }
}
